package com.gxc.array;

/**
 * 2708. 一个小组的最大实力值
 * 给你一个下标从 0 开始的整数数组 nums ，它表示一个班级中所有学生在一次考试中的成绩。老师想选出一部分同学组成一个 非空 小组，且这个小组的 实力值 最大，如果这个小组里的学生下标为 i0, i1, i2, ... , ik ，那么这个小组的实力值定义为 nums[i0] * nums[i1] * nums[i2] * ... * nums[ik​] 。
 *
 * 请你返回老师创建的小组能得到的最大实力值为多少。
 */
public class MaxStrength {

    public static void main(String[] args) {
        System.out.println(handle(new int[]{
                3,-1,-5,2,5,-9
        }));

        System.out.println(handle(new int[]{
                -4,-5,-4
        }));

        System.out.println(handle(new int[]{
                0,-1
        }));
    }

    public static long handle(int[] nums) {
        if (nums.length == 1) return nums[0];
        //如果最后结果四害负数。则除以最大的负数就似乎最大的值
        int max = Integer.MIN_VALUE;
        //统计选中的位置数量，如果num=1，res为负数，则返回0
        int num = 0;
        //针对全是0
        long res = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] ==0) continue;
            num++;
            if (res == 0) res=1;
            res *= nums[i];
            if (nums[i] < 0) {
                max = Math.max(max, nums[i]);

            }
        }
        if (res >= 0) return res;
        if (num == 1) return  0;
        res = res / max;
        return res;
    }

    class Solution {
        public long maxStrength(int[] nums) {
            int negativeCount = 0, zeroCount = 0, positiveCount = 0;
            long prod = 1;
            int maxNegative = -9;
            for (int num : nums) {
                if (num < 0) {
                    negativeCount++;
                    prod *= num;
                    maxNegative = Math.max(maxNegative, num);
                } else if (num == 0) {
                    zeroCount++;
                } else {
                    prod *= num;
                    positiveCount++;
                }
            }
            if (negativeCount == 1 && zeroCount == 0 && positiveCount == 0) {
                return nums[0];
            }
            if (negativeCount <= 1 && positiveCount == 0) {
                return 0;
            }
            if (prod < 0) {
                return prod / maxNegative;
            } else {
                return prod;
            }
        }
    }

}
